home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / aztecnos.arc / TTYDRIV.C < prev    next >
Encoding:
C/C++ Source or Header  |  1988-12-05  |  2.3 KB  |  119 lines

  1. /* TTY input driver */
  2. #include <stdio.h>
  3. #include "global.h"
  4. #include "mbuf.h"
  5. #include "tty.h"
  6.  
  7. static int edit;
  8. static int echo;
  9. #define    OFF    0
  10. #define    ON    1
  11.  
  12.  
  13. #define    LINESIZE    256
  14.  
  15. #define    CTLU    21
  16. #define CTLR    18
  17. #define    CTLZ    26
  18.  
  19. /* Return current TTY status */
  20. int
  21. ttygetmode()
  22. {
  23.     return (edit << 1) | echo;
  24. }
  25. /* Set TTY modes */
  26. ttysetmode(x)
  27. int x;
  28. {
  29.     edit = (x & 2) ? 1 : 0;
  30.     echo = x & 1;
  31. }
  32. /* Accept characters from the incoming tty buffer and process them
  33.  * (if in cooked mode) or just pass them directly (if in raw mode).
  34.  * Returns the number of characters available for use; if non-zero,
  35.  * also stashes a pointer to the character(s) in the "buf" argument.
  36.  */
  37.  /*Control-R added by df for retype of lines - useful in Telnet */
  38.  
  39. struct mbuf *
  40. ttydriv(c)
  41. char c;
  42. {
  43.     static struct mbuf *bp;
  44.     struct mbuf *nbp;
  45.     static char *cp;
  46.     char *rp;
  47.  
  48.     switch(edit){
  49.     case OFF:
  50.         if((nbp = alloc_mbuf(1)) == NULLBUF)
  51.             return NULLBUF;
  52.         *nbp->data = c;
  53.         nbp->cnt = 1;
  54.         if(echo)
  55.             putchar(c);
  56.         return nbp;
  57.     case ON:
  58.         if(bp == NULLBUF){
  59.             if((bp = alloc_mbuf(LINESIZE)) == NULLBUF)
  60.                 return NULLBUF;
  61.             cp = bp->data;
  62.         }
  63.         /* Perform cooked-mode line editing */
  64.         switch(c & 0x7f){
  65.         case '\r':    /* CR and LF are equivalent */
  66.         case '\n':
  67.             *cp++ = '\r';
  68.             *cp++ = '\n';
  69.             if(echo)
  70.                 printf("\n");
  71.             bp->cnt = cp - bp->data;
  72.             nbp = bp;
  73.             bp = NULLBUF;
  74.             return nbp;
  75.         case '\b':        /* Backspace */
  76.             if(cp != bp->data){
  77.                 cp--;
  78.                 if(echo)
  79.                     printf("\b \b");
  80.             }
  81.             break;
  82.         case CTLR:    /* print line buffer */
  83.             if(echo){
  84.                 printf("^R\n") ;
  85.                 rp = bp->data;
  86.                 while (rp < cp)
  87.                     putchar(*rp++) ;
  88.             }
  89.             break ;
  90.         case CTLU:    /* Line kill */
  91.             while(cp != bp->data){
  92.                 cp--;
  93.                 if(echo){
  94.                     printf("\b \b");
  95.                 }
  96.             }
  97.             break;
  98.         default:    /* Ordinary character */
  99.             *cp++ = c;
  100.                 
  101. #ifndef    AMIGA
  102.             /* ^Z apparently hangs the terminal emulators under
  103.              * DoubleDos and Desqview. I REALLY HATE having to patch
  104.              * around other people's bugs like this!!!
  105.              */
  106.             if(echo && c != CTLZ && cp < &bp->data[LINESIZE-1])
  107.                 putchar(c);
  108. #endif
  109.             if(cp >= &bp->data[LINESIZE-1]){
  110.                 putchar('\007');    /* Beep */
  111.                 cp--;
  112.             }
  113.             break;
  114.         }
  115.         break;
  116.     }
  117.     return NULLBUF;
  118. }
  119.